package com.example.springboot.service;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springboot.common.AuthAccess;
import com.example.springboot.common.Page;
import com.example.springboot.exception.ServiceException;
import com.example.springboot.mapper.UserMapper;
import com.example.springboot.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.springboot.entity.User;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;

/**
 * 功能：
 * 作者帆哥
 * 日期： 2024/8/9 22:53
 */
//@Service
//public class UserService {
//
//    //注入
//    @Autowired
//    UserMapper userMapper;
//
//
//    user对象从方法过来（controller）,user从前端传过来
//    controller里面传到service
//    service在传到mapper
//    mapper通过service执行
//    public void insertUser(User user) {
//        userMapper.insert(user);
//    }
//
//    public void updateUser(User user) {
//        userMapper.updateUser(user);
//    }
//
//    public void deleteUser(Integer id) {
//        userMapper.deleteUser(id);
//    }
//
//    //批量删除
//    public void batchDeleteUser(List<Integer> ids) {
//        for (Integer id : ids) {
//            userMapper.deleteUser(id);
//        }
//    }
//
//    //查询所有
//    public List<User> selectAll() {
//        return userMapper.selectAll();
//    }
//
//    //单个条件查询
//    public User selectById(Integer id) {
//        return userMapper.selectById(id);
//    }
//
//    //单个条件查询
//    public List<User> selectByName(String name) {
//        return userMapper.selectByName(name);
//    }
//
//    //多个条件查询
//    public List<User> selectByMore(String username, String name) {
//        return userMapper.selectByMore(username, name);
//    }
//
//    //多个条件模糊查询
//    public List<User> selectByMo(String username, String name) {
//        return userMapper.selectByMo(username, name);
//    }
//
//    //多个条件分页模糊查询
//    public Page<User> selectByPage(Integer pageNum, Integer pageSize, String username, String name) {
//        Integer skipNum = (pageNum - 1) * pageSize;  // 计算出来  1 -> 0,5    2 -> 5,5   3 -> 10,5
//
//        Page<User> page = new Page<>();
//
//        List<User> userList = userMapper.selectByPage(skipNum, pageSize, username, name);
//        Integer total = userMapper.selectCountByPage(username, name);
//        page.setTotal(total);
//        page.setList(userList);
//        return page;
//    }
//    //验证用户账号是否合法
//    public User login(User user) {
//        //根据用户名
//        User dbUser = userMapper.selectUsername(user.getUsername());
//        if (dbUser == null) {
//            //抛出一个异常
//            throw new ServiceException("账号不存在");
//        }
//        if (!user.getPassword().equals(dbUser.getPassword())) {
//            throw new ServiceException("用户名或密码错误");
//        }
//
//        //生成token
//        String token = TokenUtils.createToken(dbUser.getId().toString(), dbUser.getPassword());
//        dbUser.setToken(token);
//        return dbUser;
//    }
//
//    //注册
//    public User register(User user) {
//        //根据用户名
//        User dbUser = userMapper.selectUsername(user.getUsername());
//        if (dbUser != null) {
//            //抛出一个异常
//            throw new ServiceException("用户名已存在");
//        }
//        user.setName(user.getUsername());
//        userMapper.insert(user);
//
//        return user;
//    }

//    //忘记密码
//    public void resetPassword(User user) {
//        User dbUser = userMapper.selectUsername(user.getUsername());
//        if (dbUser == null) {
//            //抛出异常
//            throw new ServiceException("用户不存在");
//        }
//        if (!dbUser.getPhone().equals(dbUser.getPhone())) {
//            throw new ServiceException("数据验证失败");
//        }
//        dbUser.setPassword("123");
//        userMapper.updateUser(dbUser);
//    }
//}

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    //注入
    @Resource
    UserMapper userMapper;

    /**
     * 重写父内方法
     *
     * @param entity
     * @return
     */
    @Override
    public boolean save(User entity) {
        if (StrUtil.isBlank(entity.getName())) {
            entity.setName(entity.getUsername());
        }
        if (StrUtil.isBlank(entity.getPassword())) {
            entity.setPassword("123"); // 默认密码
        }
        if (StrUtil.isBlank(entity.getRole())) {
            entity.setRole("用户"); //默认用户
        }
        return super.save(entity);
    }

    @Override
    public boolean removeById(User entity) {
        User currentUser = TokenUtils.getCurrentUser();
        if (entity.getId().equals(currentUser.getId())) {
            throw new ServiceException("不能删除当前的用户");
        }
        return super.removeById(entity);
    }

    @Override
    public boolean removeBatchByIds(Collection<?> list) {
        User currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null && currentUser.getId() != null && list.contains(currentUser.getId())) {
            throw new ServiceException("不能删除当前的用户");
        }
        return super.removeBatchByIds(list);
    }


    //封装通用方法
    public User selectByUsername(String username) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        //根据用户名查询数据库的用户信息
        //return userMapper.selectOne(queryWrapper); //select * from user where username = #{username}
        return this.getOne(queryWrapper);
    }

    //验证用户账号是否合法
    public User login(User user) {
        //根据用户名
        //User dbUser = userMapper.selectUsername(user.getUsername());
        User dbUser = selectByUsername(user.getUsername());
        if (dbUser == null) {
            //抛出一个异常
            throw new ServiceException("账号不存在");
        }
        if (!user.getPassword().equals(dbUser.getPassword())) {
            throw new ServiceException("用户名或密码错误");
        }

        //生成token
        String token = TokenUtils.createToken(dbUser.getId().toString(), dbUser.getPassword());
        dbUser.setToken(token);
        return dbUser;
    }

    //注册
    public User register(User user) {
        //根据用户名
        //User dbUser = userMapper.selectUsername(user.getUsername());
        User dbUser = selectByUsername(user.getUsername());
        if (dbUser != null) {
            //抛出一个异常
            throw new ServiceException("用户名已存在");
        }
        user.setName(user.getUsername());
        userMapper.insert(user);

        return user;
    }

    //忘记密码
    public void resetPassword(User user) {
        //User dbUser = userMapper.selectUsername(user.getUsername());
        User dbUser = selectByUsername(user.getUsername());
        if (dbUser == null) {
            //抛出异常
            throw new ServiceException("用户不存在");
        }
        if (!dbUser.getPhone().equals(dbUser.getPhone())) {
            throw new ServiceException("数据验证失败");
        }
        dbUser.setPassword("123");
        //userMapper.updateUser(dbUser);
        updateById(dbUser);
    }
}
